﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Cube2
{
    public class ChaseCamera:CCamera
    {
        public Vector3 Position { get; private set; }
        public Vector3 Target { get; private set; }
        public Vector3 FollowTargetPosition { get; private set; }
        public Vector3 FollowTargetRotation { get; private set; }
        public Vector3 PositionOffset { get; set; }
        public Vector3 TargetOffset { get; set; }
        public Vector3 RelativeCameraRotation { get; set; }//vi tri tuong doi
        float springiness = 0.1f;
        public float Springiness
        {
            get { return springiness; }
            set { springiness = MathHelper.Clamp(value, 0, 1); }

        }
        public ChaseCamera(Vector3 PositionOffset, Vector3 TargetOffset, Vector3 RelativeCameraRotation, GraphicsDevice GraphicDevice)
            : base(GraphicDevice)
        {
            this.PositionOffset = PositionOffset;
            this.TargetOffset = TargetOffset;
            this.RelativeCameraRotation = RelativeCameraRotation;
        }
        public void Move(Vector3 NewFollowTargetPosition, Vector3 NewFollowTargetRotation)
        {
            this.FollowTargetPosition = NewFollowTargetPosition;
            this.FollowTargetRotation = NewFollowTargetRotation;
        }
        public void Rotate(Vector3 RotationChange)
        {
            this.RelativeCameraRotation += RotationChange;
        }
        public override void Update()
        {
            //Đây là Vector kết hợp giữa Vector xoay của vật và Vector xoay tương đối của camera so với vật
            Vector3 combinedRotation = FollowTargetRotation + RelativeCameraRotation;
            //tính toán ma trận xoay của camera
            Matrix rotation = Matrix.CreateFromYawPitchRoll(combinedRotation.Y, combinedRotation.X, combinedRotation.Z);
            //Vị trí cứng của camera bằng vị trí vật+ vị trí Offset giữa camera và vật
            Vector3 desiredPosition = FollowTargetPosition + Vector3.Transform(PositionOffset, rotation);
            //Vector3.Lerp(Vector3 v1,Vector3 v2,float amount) có công thức v1+(v2-v1)*amount
            //Hàm này để tính ra vị trí của camera với 1 độ co giãn
            Position = Vector3.Lerp(Position,desiredPosition,Springiness);
            //Vị trí camera hướng đến
            Target = FollowTargetPosition + Vector3.Transform(TargetOffset, rotation);
            //Up là vector up của ma trận rotation đã tính ở trên
            Vector3 up = Vector3.Transform(Vector3.Up, rotation);
            //tính View
            View = Matrix.CreateLookAt(Position,Target,up);
        }

    }
}
